package server;

import client.GenericClientOnServer;

import java.util.ArrayList;

/**
 * Questa classe identifica una routine del server che ogni secondo va a verificare se ci sono client da eliminare. Un
 * client viene eliminato se non ha eseguito azioni per 5 minuti.
 * @author Claudio "Dna" Bonesana
 */
public class KickRoutine extends Thread{

    static long maxTime = 5 * 60 * 1000;

    private ArrayList<GenericClientOnServer> users;
    private HTTPServer server;

    private boolean working;

    /**
     * Costruisce una nuova routine associando il server e la lista utenti.
     * @param server    il server a cui appartiene questa routine
     */
    public KickRoutine(HTTPServer server) {
        this.server = server;
        this.users = server.getUsers();
        this.working = true;
    }

    /**
     * Termina in sicurezza il thread.
     */
    public synchronized void stopThread(){
        working = false;
    }

    /**
     * Ogni secondo questa routine richiede a tutti i client connessi il loro ultimo aggiornamentoi. Se questo aggiornamento
     * più {@link #maxTime} è inferiore al tempo attuale, il client viene eliminato per inattività.
     */
    @Override
    public void run() {
        while (working){
            for (GenericClientOnServer user : users){
                if (user.getLastUpdate() + maxTime < System.currentTimeMillis()){
                    /*  Solo l'utente da elimnare viene notificato  */
                    user.update("You have been kicked for <span style=\"color: red\">inactivity</span>.");
                    user.update("/kick");
                }
            }
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                break;
            }
        }
    }
}
